/*
判断驱动器是否为光驱以及是否放入光盘

GetDriveType、GetVolumeInformation函数
GetLastError函数
_tprintf函数
*/
#include <windows.h>
#include <stdio.h>
#include <tchar.h>

int ChkArgcNum(int argc, PCTSTR szFuncName);
int ChkCdrom(PCTSTR szRootPathName);
void ChkCdFileSystem(PCTSTR szRootPathName);

int main(int argc, PCTSTR argv[])
{
    // 检查程序的命令行参数是否2个
    if (!ChkArgcNum(argc, *argv)) {
        return -1;
    }

    // 判断驱动器是否为光驱
    if (ChkCdrom(*(argv+1))!=0) {
        return -2;
    }

    // 判断光驱中是否放入光盘
    ChkCdFileSystem(*(argv+1));

    return 0;
}

/* 检查程序的命令行参数是否2个 */
int ChkArgcNum(int argc, PCTSTR szFuncName)
{
    if (argc!=2) {
        _tprintf(TEXT("请以如下形式输入参数。比如：\n\t %s D:\\"), szFuncName);
        return 0;
    }

    return 1;
}

/* 判断驱动器是否为光驱 */
int ChkCdrom(PCTSTR szRootPathName)
{
    int iType = GetDriveType(szRootPathName);

    // GetDriveType函数返回值是DRIVE_CDROM，驱动器是光驱
    if (iType == DRIVE_CDROM) {
        _tprintf(TEXT("\t %s 是光盘。\n"), szRootPathName);
        return 0;
    } else if (iType == DRIVE_FIXED) {
        _tprintf(TEXT("\t %s 是硬盘。\n"), szRootPathName);
        return 1;
    } else if (iType == DRIVE_NO_ROOT_DIR) {
        _tprintf(TEXT("\t %s 是无效的根路径。\n"), szRootPathName);
        return 2;
    } else if (iType == DRIVE_UNKNOWN) {
        _tprintf(TEXT("\t无法确定驱动器 %s 的类型。\n"), szRootPathName);
        return 3;        
    }

    return 4;
}

/* 判断光驱中是否放入光盘 */
void ChkCdFileSystem(PCTSTR szRootPathName)
{
    DWORD dwSystemFlags;
    TCHAR FileSystemNameBuffer[MAX_PATH];
    DWORD dwLastError;

    // GetVolumelnformation函数返回值是FALSE
    // 且GetLastError函数返回值是21
    // 说明驱动器中未放入光盘
    if (!(GetVolumeInformation(szRootPathName, NULL, 0, NULL, NULL, &dwSystemFlags, FileSystemNameBuffer, MAX_PATH))) {
        dwLastError = GetLastError();
        if (dwLastError == 21) {
            _tprintf(TEXT("\t设备未就绪，请放入光盘！\n"));
        } else {
            _tprintf(TEXT("\t获取驱动器信息出错！\n"));
        }
    } else {
        _tprintf(TEXT("\t光盘已经放入，文件系统类别%s\n"), FileSystemNameBuffer);
    } 
}